#!/usr/bin/env python3
# 唯一文件复制工具 - 根据重复文件列表JSON，复制每个MD5组的第一个文件到目标目录
# 使用方法:
# python cpy_unique.py -list "c:\aaa\202505140829.json" -output "f:\bbb" -report "c:\"
# 参数说明:
#   -list: 重复文件列表JSON文件路径，由dup_collect.py生成
#   -output: 输出目录，用于存放复制的唯一文件
#   -report: 报告文件保存目录，将生成"复制操作报告+日期时间.txt"格式的文件

import os
import json
import shutil
import argparse
from datetime import datetime

def copy_unique_files(json_path, output_dir, report_dir):
    """根据JSON文件复制唯一文件并生成报告"""
    # 确保输出目录和报告目录存在
    os.makedirs(output_dir, exist_ok=True)
    os.makedirs(report_dir, exist_ok=True)
    
    # 读取JSON文件
    print(f"正在读取重复文件列表: {json_path}")
    with open(json_path, 'r', encoding='utf-8') as f:
        file_dict = json.load(f)
    
    total_files = len(file_dict)
    print(f"准备复制 {total_files} 个唯一文件")
    
    # 生成报告文件名
    current_time = datetime.now().strftime("%Y%m%d%H%M")
    report_filename = f"复制操作报告{current_time}.txt"
    report_path = os.path.join(report_dir, report_filename)
    
    print(f"报告将保存至: {report_path}")
    
    # 记录复制操作
    with open(report_path, 'w', encoding='utf-8') as report_file:
        for i, (file_hash, file_paths) in enumerate(file_dict.items(), 1):
            if file_paths:
                source_file = file_paths[0]
                file_name = os.path.basename(source_file)
                target_file = os.path.join(output_dir, file_name)
                
                # 确保目标文件的目录存在
                target_dir = os.path.dirname(target_file)
                os.makedirs(target_dir, exist_ok=True)
                
                # 处理重名文件
                counter = 1
                while os.path.exists(target_file):
                    base, ext = os.path.splitext(file_name)
                    new_name = f"{base}_{counter}{ext}"
                    target_file = os.path.join(output_dir, new_name)
                    counter += 1
                
                try:
                    # 显示复制进度
                    progress = (i / total_files) * 100
                    print(f"复制文件 {i}/{total_files} ({progress:.1f}%): {source_file} -> {target_file}")
                    
                    # 复制文件
                    shutil.copy2(source_file, target_file)
                    
                    # 记录到报告
                    report_file.write(f'"{source_file}" -> "{target_file}"\n')
                except (OSError, PermissionError) as e:
                    print(f"无法复制文件 {source_file}: {e}")
    
    print(f"文件复制完成，报告已保存至: {report_path}")

def main():
    # 设置命令行参数解析
    parser = argparse.ArgumentParser(description="复制唯一文件并生成报告")
    parser.add_argument("-list", required=True, help="重复文件列表JSON文件路径")
    parser.add_argument("-output", required=True, help="输出目录")
    parser.add_argument("-report", required=True, help="报告文件保存目录")
    args = parser.parse_args()
    
    # 执行复制操作
    copy_unique_files(args.list, args.output, args.report)

if __name__ == "__main__":
    main()    